package com.sun.dream.fish.secret.symmetry;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class DESExample {

    public static String encrypt(String key, String plaintext) throws Exception {
        //64位也就是8字节的加密字符串
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        //DES指定了使用DES算法进行加密。
        //ECB表示使用ECB（Electronic Codebook）模式，这是一种基本的加密模式，它将一个明文分成多个块，并对每个块分别进行加密。
        //PKCS5Padding指定了使用PKCS5填充（也称为PKCS7填充），用于在最后一个块不满足加密算法的块大小时，填充数据以达到块大小的要求。这种填充方式在保证数据完整性的同时，能够正确区分原始数据和填充数据。
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        //mode为加密
        cipher.init(Cipher.ENCRYPT_MODE, secretKey);
        byte[] encryptedBytes = cipher.doFinal(plaintext.getBytes(StandardCharsets.UTF_8));
        //将加密完成的字节数组转化成base64字符串
        return Base64.getEncoder().encodeToString(encryptedBytes);
    }

    public static String decrypt(String key, String ciphertext) throws Exception {
        //64位也就是8字节的加密字符串
        DESKeySpec desKeySpec = new DESKeySpec(key.getBytes(StandardCharsets.UTF_8));
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
        //DES指定了使用DES算法进行加密。
        //ECB表示使用ECB（Electronic Codebook）模式，这是一种基本的加密模式，它将一个明文分成多个块，并对每个块分别进行加密。
        //PKCS5Padding指定了使用PKCS5填充（也称为PKCS7填充），用于在最后一个块不满足加密算法的块大小时，填充数据以达到块大小的要求。这种填充方式在保证数据完整性的同时，能够正确区分原始数据和填充数据。
        Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
        //mode为解密
        cipher.init(Cipher.DECRYPT_MODE, secretKey);
        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(ciphertext));
        //将解密完成的字节数组转化成对应的utf8编码的字符串
        return new String(decryptedBytes, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) {
        try {
            //加密的公钥
            String key = "your_key";
            //需要加密的文本
            String plaintext = "Hello, World!eadfadasddddasdsssss";

            String encryptedText = encrypt(key, plaintext);
            System.out.println("Encrypted Text: " + encryptedText);

            String decryptedText = decrypt(key, encryptedText);
            System.out.println("Decrypted Text: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}